package com.wx.gof.pattern.behavioral.command;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 将请求封装存对象,以便使用不同的请求
 * 描述:
 * 命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象,发送者与接收者解耦，发送者与接收者没有直接的引用关系
 * 发送请求的对象只知道如何发送请求，它不需要知道如何完成请求，完成请求交给处理请求对象去做
 * 适用场景:
 * 1.请求调用者和请求接收者需要解耦，使得调用者和接收者不直接交互
 * 2.需要抽象出等待执行的行为
 * 优点：
 * 1.命令模式使得发起命令的对象——客户端，和具体实现命令的对象——接收者对象完全解耦，也就是说发起命令的对象完全不知道具体实现对象是谁，也不知道如何实现。
 * 2.命令模式把请求封装起来，可以动态地对它进行参数化、队列化和日志化等操作，从而使得系统更灵活。
 * 3.命令模式中的命令对象能够很容易地组合成复合命令，也就是宏命令，从而使系统操作更简单，功能更强大
 * 4.由于发起命令的对象和具体的实现完全解耦，因此扩展新的命令就很容易，只需要实现新的命令对象，然后在装配的时候，把具体的实现对象设置到命令对象中，然后就可以使用这个命令对象，已有的实现完全不用变化。
 * 缺点:
 * 1.类目增多
 * 理解:
 * 应用程序-命令模式(适合发送者与接收者的解耦，发送者只需要发送请求，他不关心请求如何完成)
 * @Date 2018-12-14-23:33
 */
public class Application {
    public static void main(String[] agrs){
        //接收者
        Computer computer = new Computer();
        //请求1设置接收者
        ICommand openComputerCommand = new OpenComputerCommand(computer);
        //请求2设置接收者
        ICommand closeComputerCommand = new CloseComputerCommand(computer);
        //请求角色
        Invoker invoker = new Invoker();
        //接收请求
        invoker.addCommand(openComputerCommand);
        invoker.addCommand(closeComputerCommand);
        //发送执行请求
        invoker.executeCommand();
    }
}
